home *** CD-ROM | disk | FTP | other *** search
- /*==============================================================================
-
- FICHERO: EPSON.C
-
- AUTOR: ANTONIO LADESA JURADO
-
- FECHA: 24/6/94
-
- DESCRIPCION:
-
- Fichero que contiene las estructuras, constantes, variables y funciones
- internas y externas para la impresión de las imágenes en una impresora
- EPSON FX-80 o compatible (o a fichero).
-
- ==============================================================================*/
-
-
- /*---- MODULOS USADOS --------------------------------------------------------*/
-
- #include <stdio.h>
- #include <conio.h>
- #include <dos.h>
- #include <string.h>
-
- #include "global.h"
- #include "memoria.h"
- #include "video.h"
- #include "epson.h"
- #include "color.h"
- #include "escala.h"
- #include "error.h"
-
- /*---- DEFINICION DE LAS FUNCIONES INTERNAS ----------------------------------*/
-
-
- void ImprimirCadena(char *s);
- void ImprimirCaracter(int c);
- void GrabarCadena(FILE *f,char *s);
- void GrabarCaracter(FILE *f,int c);
- int LeerBit(char *p,int n,int w);
-
- /*---- CODIFICACION DE LAS FUNCIONES OFRECIDAS -------------------------------*/
-
-
- /*---- FUNCION: extern int EPSONimprimir(IMAGEN *c,char *nombre) ---------------
-
- Descripción:
-
- Esta función envía una imagen a la impresora EPSON FX-80 o
- a un fichero.
-
- Parámetros:
-
- IMAGEN *c : puntero a estructura que alberga la imagen
- char *nombre : nombre del fichero de salida (o cte = "IMPRESORA")
-
- Retorno:
-
- - 1 si hubo éxito.
- - 0 si hubo error.
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern int EPSONimprimir(IMAGEN *c,char *nombre)
- {
- /* buffer */
- char buffer[ANCHO_MAXIMO];
- /* contadores */
- int i,j,a;
- /* puntero a la imagen duplicada */
- IMAGEN *r=NULL;
- /* puntero al fichero de salida */
- FILE *f;
- /* factor de escalado */
- double factor;
-
- /* si no hay imagen, error */
- if(c==NULL)
- {
- ERRORponer(ERRnoImagen);
- return(0);
- }
-
- /* duplicar imagen para transformarla */
- if((r = IMAGENduplicar(c))!=NULL)
- {
- if(r->colores != 2)
- {
- /* si no tiene 256 colores, convertirla para obtener más calidad */
- if(r->colores < 256)
- {
- r = EscalarColores(r,256);
- ERRORver();
- }
- /* convertir a blanco y negro */
- r = BlancoYNegro(r,FLOYD);
- ERRORver();
- }
- /* si es muy grande, escalarla */
- if(r->ancho > 640)
- {
- factor = (int)(64000.0/(double)r->ancho);
- r = IMAGENescalar(r,factor,factor);
- ERRORver();
- }
- }
- else
- return(0);
-
- /* si el de stino es la impresora */
- if(!strcmp(nombre,"IMPRESORA"))
- {
- /* inicializar impresora */
- ImprimirCadena("\x1b@");
- for(i=0;i<r->alto;i+=8)
- {
- /* imprimir caracteres de control */
- ImprimirCadena("\x1b*\x06");
- ImprimirCaracter(r->ancho);
- ImprimirCaracter(r->ancho>>8);
- /* leer 8 líneas y convertir los bytes */
- for(a=0;a<8;a++)
- if(a+i<r->alto)
- MEMleer(buffer+r->bytes*a,i+a,r);
- else
- memset(buffer+r->bytes*a,0xFF,r->bytes);
- /* imprimir las ocho líneas */
- for(j=0;j<r->ancho;++j)
- ImprimirCaracter(~LeerBit(buffer,j,r->ancho));
- ImprimirCadena("\r\x1bJ\x18");
- /* comprobar si se pulsó ESCAPE */
- if(kbhit()) if(getch()==27) return(0);
- }
- /* inicializar impresora */
- ImprimirCadena("\x1b@");
- }
- else
- {
- /* abrir el fichero */
- if((f = fopen(nombre, "wb")) == NULL)
- {
- ERRORponer(ERRapertura);
- return(0);
- }
- /* escribir la imagen EPSON */
- GrabarCadena(f,"\x1b@");
- for(i=0;i<r->alto;i+=8)
- {
- GrabarCadena(f,"\x1b*\x06");
- GrabarCaracter(f,r->ancho);
- GrabarCaracter(f,r->ancho>>8);
- for(a=0;a<8;a++)
- if(a+i<r->alto)
- MEMleer(buffer+r->bytes*a,i+a,c);
- else
- memset(buffer+r->bytes*a,0,r->bytes);
- for(j=0;j<r->ancho;++j)
- GrabarCaracter(f,(~LeerBit(buffer,j,r->ancho)));
- GrabarCadena(f,"\r\x1bJ\x18");
- }
- GrabarCadena(f,"\x1b@");
- /* cerrar fichero */
- fclose(f);
- }
- /* liberar imagen duplicada */
- r = MEMliberar(r);
- return(1);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
-
- /*---- CODIFICACION DE LAS FUNCIONES INTERNAS --------------------------------*/
-
-
- /*---- FUNCION: void ImprimirCadena(char *s) -----------------------------------
-
- Descripción:
-
- Esta función envía un conjunto de caracteres a la impresora.
-
- Parámetros:
-
- char *s : puntero a la cadena de caracteres
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- void ImprimirCadena(char *s)
- {
- while(*s) ImprimirCaracter(*s++);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
-
- /*---- FUNCION: void ImprimirCaracter(int c) -----------------------------------
-
- Descripción:
-
- Esta función envía un caracter a la impresora.
-
- Parámetros:
-
- int c : caracter a enviar
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- void ImprimirCaracter(int c)
- {
- union REGS r;
-
- /* esperar mientras la impresora no esté ocupada */
- do
- {
- r.h.ah = 2;
- r.x.dx = 0;
- int86(0x17,&r,&r);
- }
- while(!(r.h.ah & 0x80));
-
- /* enviar caracter */
- r.h.ah = 0;
- r.h.al = c;
- r.x.dx = 0;
- int86(0x17,&r,&r);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
-
- /*---- FUNCION: void GrabarCadena(FILE *f,char *s) -----------------------------
-
- Descripción:
-
- Esta función envía una cadena de caracteres al fichero.
-
- Parámetros:
-
- FILE *f: puntero al fichero de salida.
- char *s : cadena a enviar
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- void GrabarCadena(FILE *f,char *s)
- {
- while(*s) GrabarCaracter(f,*s++);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
-
- /*---- FUNCION: void GrabarCaracter(FILE *f,int c) -----------------------------
-
- Descripción:
-
- Esta función envía un caracter al fichero.
-
- Parámetros:
-
- FILE *f: puntero al fichero de salida.
- int c : caracter a enviar
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- void GrabarCaracter(FILE *f,int c)
- {
- fprintf(f,"%c",c);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
-
- /*---- FUNCION: int LeerBit(char *p,int x,int ancho) -----------------------------
-
- Descripción:
-
- Esta función lee un bit de cada una de las 8 líneas, para conformar
- el byte que imprimirá el cabezal de la impresora y lo devuelve.
-
- Parámetros:
-
- char *p : puntero al buffer que contiene la 8 líneas
- int x : coordenada x a leer
- int ancho: ancho de cada línea.
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- int LeerBit(char *p,int x,int ancho)
- {
- int b,i,r=0;
-
- p+=(x/8);
-
- for(i=7;i>=0;--i)
- {
- b= *p;
- if(b & (1<<(7-x%8))) r |= (1 << i);
- p+=(ancho/8);
- }
- return(r);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/